const jwt = require('jsonwebtoken')
const {promisify} = require('util')
const {uuid} = require('.././config/config.default')
// 将jwt的api转换成支持promise
const toJwt =  promisify(jwt.sign)
const jwtVerify = promisify(jwt.verify)

module.exports.createToken = async data => {
    var token =  await toJwt(
        {data},
        uuid,
        {
            expiresIn: 60 * 60 * 24 // 过期时间 一天
        })
        return token
}
// 验证方法需要写成一个中间件 以便在多种路由中使用
module.exports.verifyToken = async (req,res,next) => {
    // jwt的token会放在请求头的authorization传递
    var token = req.headers.authorization
    // token 如果存在 取得除了前缀后的有效字段 不存在则置Null
    token = token?token.split('Bearer ')[1] : null
    if(!token){
        res.status(402).json({error:'请传入token'})
    }
    else{
        try{
            // 设置为异步
            let userinfo = await jwtVerify(token,uuid)
            // 将数据添加到req上，req会被继续向后传递，后面的中间件
            // 也都能访问 jwt
            req.user = userinfo
            next()
        } catch (error) {
            res.status(402).json({error:'无效token'})
        }
    }
}
